package javaeSE.collection;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/*
  集合元素遍历，使用迭代器Iterator接口 只是用来遍历Collection
  1.内部的方法：hasNext() 和  next()
  2.集合对象每次调用iterator()方法都得到一个全新的迭代器对象，
  默认游标都在集合的第一个元素之前。
  3.内部定义了remove(),可以在遍历的时候，删除集合中的元素。此方法不同于集合直接调用remove()
 */
public class IteratorTest {
    @Test
    public void test1(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);
        // 迭代器对象 用于遍历集合
        Iterator iterator = coll.iterator();
        //方式一：
        // System.out.println(iterator.next());
        // System.out.println(iterator.next());
        // System.out.println(iterator.next());
        // System.out.println(iterator.next());
        // //报异常：NoSuchElementException
        // System.out.println(iterator.next());

        //方式二：不推荐
        /* for(int i = 0;i < coll.size();i++){
            System.out.println(iterator.next());
        }*/

        /*for(Object obj : coll){
            System.out.println(obj);
        }*/

        //方式三：推荐
        ////hasNext():判断是否还有下一个元素有再移   方法名不要写错
        while(iterator.hasNext()){
            //next():①指针下移 ②将下移以后集合位置上的元素返回
            System.out.println(iterator.next());
        }
    }
    @Test
    public void test2(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);
        // 遍历查询错误演示
/*      错误方式一：隔行输出iterator.next())
        Iterator iterator = coll.iterator();
        while((iterator.next()) != null){  会直接下移一次
            System.out.println(iterator.next()); 会直接下移第二次
        }
        错误方式二：只会输出第一个数据
        集合对象每次调用iterator()方法都得到一个全新的迭代器对象，默认游标都在集合的第一个元素之前。所以不要使用匿名迭代器对象coll.iterator()
        while (coll.iterator().hasNext()){
            System.out.println(coll.iterator().next());
        }*/
    }
    //测试Iterator中的remove()
    //如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法，
    // 再调用remove都会报IllegalStateException。
    @Test
    public void test3(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);
        //删除集合中"Tom"
        Iterator iterator = coll.iterator();
        // 有下一个
        while (iterator.hasNext()){
            // iterator.remove(); 这里不要写remove()方法 指针还没下去
            // 移向下一个
            Object obj = iterator.next();
            if("Tom".equals(obj)){
                iterator.remove();
                //不能在指针移动之前又掉一次remove
                //iterator.remove();
            }
        }
        //遍历集合  这里要再赋值一遍
        iterator = coll.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}
